#!/usr/bin/env python3
"""
Weekly Report MCP Server
生成基于 Git 提交记录的周报工具

支持多项目配置，通过环境变量 PROJECT_PATHS 配置（路径用 | 分隔）
"""

import os
import subprocess
import sys
from typing import List, Dict

from fastmcp import FastMCP

mcp = FastMCP("weekly-report")

summary_template = """
项目名称: {project_name}
提交次数: {commit_count}
提交记录:
{commits}

"""

report_prompt_template = """
你是一个专业的周报生成器，根据 Git 提交记录生成一份专业的工作周报。

## 📋 要求
1. **分类整理**：将提交按功能开发、Bug修复、性能优化、文档更新等分类，如果提交记录不涉及对某一个分类则周报不需要体现出该分类
2. **提炼要点**：从 commit message 中提炼关键工作内容，如果多个commit message内容相似，你需要使用简洁、清晰的语言对其进行汇总而不是使用冗余的方式表达
3. **专业表述**：使用专业的技术语言，简洁明了
4. **格式规范**：使用清晰的 Markdown 格式
5. **跨项目视角**：总结跨项目的技术积累和工作思路
6. **字数限制**：字数控制在100-300字，务必要使用简洁、精炼但明确的方式进行总结


输出格式如下:
## 一、工作概述
[用2-3句话总结本周主要工作内容和成果]

## 二、详细工作内容

### 2.1 功能开发
- [功能1]：[详细描述功能内容和技术实现]
- [功能2]：[详细描述]

### 2.2 Bug修复
- [问题1]：[问题描述] → [解决方案]
- [问题2]：[问题描述] → [解决方案]

### 2.3 性能优化
- [优化项1]：[优化内容和效果]

### 2.4 其他工作
- [文档更新、代码重构等]

## 三、技术总结
[本周工作中的技术亮点、经验总结或遇到的技术挑战]


##git提交记录:

"""


def get_projects() -> List[Dict[str, str]]:
    """
    从环境变量读取项目配置
    
    Returns:
        项目列表，每个项目包含 name 和 path
    """
    paths_str = os.getenv("PROJECT_PATHS", "")
    if not paths_str:
        return []

    projects = []
    for path in paths_str.split("|"):
        path = path.strip()
        if not path:
            continue

        # 验证路径存在且是 Git 仓库
        if os.path.exists(path) and os.path.exists(os.path.join(path, ".git")):
            projects.append({
                "name": os.path.basename(path),
                "path": path
            })
        else:
            print(f"Warning: {path} 不是有效的 Git 仓库", file=sys.stderr)

    return projects


@mcp.tool()
def repo_git_summary(days: int = 7) -> str:
    """根据指定项目的git提交记录生成提交汇总

       Args:
           days: 统计最近几天的工作（默认为当前天往过去推6天也就是days=7,如果用户明确了时间例如三天内则days=3）
       """

    result: str = ''

    projects: List[Dict[str, str]] = get_projects()

    for proj in projects:
        commits_dict: Dict[str, str] = get_git_commits(proj['path'], days)
        project_name = proj.get('name', '')
        commits = commits_dict.get('commits', '')
        commit_count = commits_dict.get('commit_count', 0)
        result += summary_template.format(project_name=project_name, commit_count=commit_count, commits=commits)

    return result


def get_git_commits(repo_path: str, days: int = 7) -> Dict[str, str]:
    """
    获取指定仓库的 Git 提交记录
    
    Args:
        repo_path: 仓库路径
        days: 查询最近几天的提交
        
    Returns:
        包含 author, commits, repo_path 的字典
    """
    # 获取作者名
    result = subprocess.run(
        ["git", "config", "user.name"],
        cwd=repo_path,
        capture_output=True,
        text=True,
        check=False
    )
    author = result.stdout.strip() or "Unknown"

    # 获取提交记录
    result = subprocess.run(
        ["git", "log", f"--author={author}",
         f"--since='{days} days ago'",
         "--pretty=format:%ad|%s %b", "--date=short","--no-merges"],
        cwd=repo_path,
        capture_output=True,
        text=True,
        check=False
    )

    commits = result.stdout.strip()

    # 统计提交次数
    commit_count = len([line for line in commits.split('\n') if line.strip()]) if commits else 0

    return {
        "author": author,
        "commits": commits or "（无提交记录）",
        "commit_count": commit_count,
        "repo_path": repo_path
    }


@mcp.tool()
def git_commits_report(days: int = 7) -> str:
    """根据指定项目的git提交记录生成周报

        Args:
            days: 统计最近几天的工作（默认为当前天往过去推6天也就是days=7,如果用户明确了时间例如三天内则days=3）
        """
    projects: List[Dict[str, str]] = get_projects()
    commit_str: str = ''
    for proj in projects:
        commit_str += get_git_commits(proj['path'], days).get('commits', '')
    return f"{report_prompt_template}\n{commit_str}"


def main():
    # 运行 MCP server
    mcp.run()


if __name__ == "__main__":
    main()
